#pragma once

#include <stdlib.h>

#include "common.h"

#define STACKSIZE 100  //  栈初始数组大小

typedef struct {
    void* data[STACKSIZE];  //   栈数组
    int top;                //   栈顶指针
} SqStack;

// 初始化栈
void InitStack(SqStack* s) {
    s->top = 0;  // 栈空时栈顶指针为0
}

// 将元素e压入栈s中
// 成功，返回TRUE
// 失败，返回FALSE
Status push(SqStack* s, void* e) {
    if (s->top == STACKSIZE) {
        return FALSE;  // 栈满
    }
    s->data[s->top++] = e;  // 元素e压入栈顶，栈顶指针加1
    return TRUE;
}

// 从栈s中弹出栈顶元素，并用e返回
// 成功，返回TRUE
// 失败，返回FALSE
Status pop(SqStack* s, void** e) {
    if (s->top == 0) {
        return FALSE;  // 栈空
    }
    *e = s->data[--s->top];  // 栈顶元素出栈，栈顶指针减1
    return TRUE;
}

// 取栈s的栈顶元素，并用e返回
// 成功，返回TRUE
// 失败，返回FALSE
Status GetTop(SqStack* s, void** e) {
    if (s->top == 0) {
        return FALSE;  // 栈空
    }
    *e = s->data[s->top - 1];  // 栈顶元素
    return TRUE;
}

// 判断栈s是否为空
// 空，返回TRUE
// 非空，返回FALSE
Status StackEmpty(SqStack* s) {
    return s->top == 0;  // 栈空
}